package com.ljw.spring.annotation.aop;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @FileName LogAspects
 * @Description TODO 日志切面类
 * @Author ljw
 * @Date 2021/2/3 13:51
 * @Version 1.0
 */
@Component
@Aspect
public class LogAspects {

    /**
     * 相同切点表达式抽取成方法pointCut(){}
     * 1. 本类引用：例如 @Before("pointCut()")
     * 2. 引用其他类切面表达式： @Before("[类全路径].pointCut()")
     */
    @Pointcut(value = "execution(* com.ljw.spring.annotation.aop.MathCalculator.*(..))")
    public void pointCut(){}

    //切点表达式：
    //  语法结构： execution([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]) )
    //  注意： *代表所有，(..)代表任意参数
    //@Before(value = "execution(* com.ljw.spring.annotation.aop.MathCalculator.*(..))")
    @Before("pointCut()")
    public void logStart(JoinPoint joinpoint){
        Object[] args = joinpoint.getArgs();
        System.out.println("除法运算:"+joinpoint.getSignature().getName()+"。。。。参数列表是:{"+ Arrays.toString(args) +"}");
    }

    @After(value = "pointCut()")
    public void logEnd(JoinPoint joinpoint){
        System.out.println("除法"+joinpoint.getSignature().getName()+"结束。。。。");
    }

    //方法参数JoinPoint joinpoint必须写在第一个参数位置
    //returning = "result"  :  指定方法参数中的哪一个参数绑定方法返回值
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(JoinPoint joinpoint,Object result){
        System.out.println("除法"+joinpoint.getSignature().getName()+"正常返回。。。。运行结果是{"+result+"}");
    }


    //throwing = "e"：  指定方法参数中的哪一个参数绑定方法的异常信息
    @AfterThrowing(value = "pointCut()",throwing = "e")
    public void logException(JoinPoint joinpoint,Exception e){
        System.out.println("除法"+joinpoint.getSignature().getName()+"异常。。。。异常信息：{"+e.getMessage()+"}");
    }
}
